package com.unitd.frame.mybatis.core.provider;

import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * @desc 所有自定义Provider的顶级接口,封装常用的dubbo服务的增删查改操作
 * @param <Model> 代表实际业务操作中的数据对象
 * @param <PK> 对象的主键类型
 * @filename IBaseProvider.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017/2/22
 */
public interface IBaseProvider<VO, Model, PK> {

	/**
	 * @desc 保存(持久化)对象(完全保存)
	 * @param vo 数据传输对象
	 * @param clazz 要持久化的对象
	 */
	int insert(VO vo, Class<Model> clazz);

	/**
	 * @desc 保存(持久化)对象(非空字段保存,空字段按照默认值)
	 * @param vos 数据传输对象
	 * @param clazz 要持久化的对象
	 */
	int insertSelective(VO vos, Class<Model> clazz);

	/**
	 * @desc 批量保存(持久化)对象(完全保存)
	 * @param vos 数据传输对象
	 * @param clazz 要持久化的对象
	 */
	int batchInsert(List<VO> vos, Class<Model> clazz);

	/**
	 * @desc 批量保存(持久化)对象(非空字段保存,空字段按照默认值)
	 * @param vo 数据传输对象
	 * @param clazz 要持久化的对象
	 */
	int batchInsertSelective(List<VO> vo, Class<Model> clazz);

	/**
	 * @desc 根据指定的唯一标识符删除持久化对象
	 * @param id 指定的唯一标识符
	 */
	int deleteByPrimaryKey(PK id);

	/**
	 * @desc 更新(持久化)对象
	 * @param vo 数据传输对象
	 * @param clazz (持久化)对象
	 */
	int updateByPrimaryKey(VO vo, Class<Model> clazz);

	/**
	 * @desc 更新(持久化)对象
	 * @param vo 数据传输对象
	 * @param clazz (持久化)对象
	 */
	int updateByPrimaryKeySelective(VO vo, Class<Model> clazz);

	/**
	 * @desc 获取指定的唯一标识符对应的持久化对象
	 * @param clazz 数据传输对象
	 * @param id 指定的唯一标识符
	 * @return 指定的唯一标识符对应的持久化对象，如果没有对应的持久化对象，则返回null。
	 */
	VO getByKey(Class<VO> clazz, PK id);

	/**
	 * @desc 获取指定条件对应的持久化对象
	 * @param vo 查询条件
	 * @param voClazz 前端需要展示的数据对象类
	 * @param clazz 持久化数据对象类
	 * @return 指定持久对象的所有 记录,如果没有对应的持久化对象，则返回null。
	 */
	VO getByBean(VO vo, Class<VO> voClazz, Class<Model> clazz);

	/**
	 * @desc 根据指定查询条件,获取对应的记录列表
	 * @param vo 查询条件
	 * @param voClazz 前端需要展示的数据对象类
	 * @param clazz 持久化数据对象类
	 * @return 指定持久对象的所有 记录,如果没有对应的持久化对象，则返回null。
	 */
	List<VO> listByBean(VO vo, Class<VO> voClazz, Class<Model> clazz);

	/**
	 * @desc 获取所有记录
	 * @param clazz 需要转换成的数据类型
	 * @return 指定持久对象的所有 记录,如果没有对应的持久化对象，则返回null。
	 */
	List<VO> listAll(Class<VO> clazz);

	/**
	 * @desc 查询分页数据
	 * @param pageNo 当前页数
	 * @param pageSize 每页记录数
	 * @param clazz 需要转换成的数据类型
	 * @return 分页对象
	 */
	PageInfo<VO> getPageData(int pageNo, int pageSize, Class<VO> clazz);

	/**
	 * @desc 查询分页数据
	 * @param pageNo 当前页数
	 * @param pageSize 每页记录数
	 * @param clazz 需要转换成的数据类型
	 * @param model 查询条件
	 * @return 分页对象
	 */
	PageInfo<VO> getPageData(int pageNo, int pageSize, Class<VO> clazz, Model model);
}